문서 형식 정의
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
문서 형식 정의(DTD)는 XML 또는 SGML 문서 간의 표준을 제시하고 통합하기 위해 사용되는 기술이다. DTD는 문서 내 태그의 명칭, 의미, 순서, 속성 사용 규격, 데이터 값 등에 대한 규칙을 정의하여 문서의 구조와 유효성을 검사하는 데 활용된다. DTD는 요소형 선언, 속성 목록 선언, 엔티티 선언, 표기법 선언으로 구성되며, DOCTYPE 선언을 통해 XML 또는 SGML 문서에 연결된다. DTD는 XML 스키마와 같은 대안 기술에 비해 네임스페이스 지원의 부재, 제한적인 변수 표현 방식 등의 단점을 가지고 있다.
더 읽어볼만한 페이지
- XML 기반 표준 - XAML
XAML은 마이크로소프트에서 개발한 XML 기반의 마크업 언어로, 사용자 인터페이스, 데이터 바인딩, 이벤트 처리 등을 정의하며 WPF, Silverlight, WF, WinRT API 앱, Xamarin.Forms 등에서 UI 개발에 널리 사용된다. - XML 기반 표준 - 아톰 (표준)
Atom은 웹 사이트 업데이트 정보와 콘텐츠 배포를 위한 XML 기반 문서 형식으로, Atom 배포 형식과 Atom 출판 프로토콜로 구성되어 있으며, RSS를 대체하기 위해 고안되었고 국제화 지원 및 모듈성에서 차이를 보인다.
문서 형식 정의 | |
---|---|
개요 | |
유형 | 메타 언어 |
설계 | SGML |
확장자 | .dtd |
역사 | |
첫 공개 | 1986년 |
개발 | ISO |
기술 | |
종류 | 마크업 언어 |
사용 목적 | XML SGML HTML |
상세 정보 | |
설명 | 문서 형식 정의는 SGML 계열 마크업 언어에 대한 마크업 선언 집합이다. |
2. DTD의 사용 의의
DTD나 XML 스키마는 다양한 XML 또는 SGML 문서 간의 표준을 제시하고 통합하기 위해 사용된다. DTD를 사용하면 다음과 같은 문제를 해결할 수 있다.
문제점 |
---|
같은 뜻을 포함하고 있지만, 태그의 명칭이 다를 수 있다. |
같은 태그 명칭을 사용하고 있지만 다른 뜻을 나타낼 수 있다. |
태그가 있는지 확실하지 않다. |
태그의 순서성이 확실하지 않다. |
속성의 사용 규격이 확실하지 않다. |
태그 내 데이터 값에 대한 기준이 정해져 있지 않다. |
DTD는 '''요소형 선언''', '''속성 목록 선언''', '''엔티티 선언'''(또는, '''실체 참조 선언'''), '''표기법 선언'''으로 구성된다.[3]
3. DTD의 구조
3. 1. 요소 형식 선언
XML/SGML 문서에서 사용할 요소를 선언하고, 요소의 이름, 요소 간의 관계, 순서 등을 정의한다. `` 형식으로 선언한다. 구성 요소는 다음과 같이 나뉜다.
예시:
```dtd
3. 2. 속성 목록 선언
속성 목록은 주어진 요소 유형에 대해 해당 유형과 관련된 모든 가능한 속성의 목록을 지정한다. 각 가능한 속성에 대해 다음을 포함한다.[4]
SGML/XML 문서의 요소가 갖는 속성의 유형과 기본값을 정의한다.
``
예를 들어, 배우의 출신 지역을 속성으로 정의하는 경우, 다음과 같은 속성 목록을 생각할 수 있다.
``
위 예시는 `배우` 요소에 `출신지역`이라는 속성을 정의하고, 가능한 속성값들을 나열한 후 기본값을 "칸토"로 지정한다.
다음은 SGML과 XML에서 모두 지원하는 몇 가지 속성 유형이다.
속성 유형 | 설명 |
---|---|
`CDATA` | 문자 데이터를 의미하며 속성의 유효한 값이 고정으로 지정되지 않는 한 모든 텍스트 값이 될 수 있음을 나타낸다. |
`ID` | 속성의 유효한 값은 유효한 식별자여야 하며, 이 정의된 식별자를 사용하여 참조 대상을 정의하고 현재 요소에 고정한다. 동일한 문서의 다른 요소가 동일한 식별자를 정의하는 경우 오류가 발생한다. |
`IDREF` 또는 `IDREFS` | 속성의 유효한 값은 유효한 식별자(또는 이러한 식별자의 공백으로 구분된 목록)일 수 있으며, 문서에 정의된 고유한 요소를 참조해야 한다. |
`NMTOKEN` 또는 `NMTOKENS` | 속성의 유효한 값은 유효한 이름 토큰(또는 이러한 이름 토큰의 공백으로 구분된 목록)일 수 있지만 문서 내의 고유한 식별자로 제한되지 않는다. |
`ENTITY` 또는 `ENTITIES` | 속성의 유효한 값은 구문 분석되지 않은 외부 엔티티의 이름(또는 이러한 이름의 공백으로 구분된 목록)일 수 있으며, 문서 유형 선언에서도 선언되어야 한다. |
...)` | 속성의 유효한 값은 열거된 목록 중 하나일 수 있다. |
...)` | 속성의 유효한 값은 표기법 이름의 열거된 목록 중 하나일 수 있으며, 문서 유형 선언에서도 선언되어야 한다. |
기본값은 속성이 발생해야 하는지(#REQUIRED
) 또는 발생하지 않아야 하는지(#IMPLIED
), 고정된 값을 갖는지(#FIXED
), 또는 XML 태그에서 주어진 속성이 생략된 경우 어떤 값을 기본값으로 사용해야 하는지("…")를 정의할 수 있다.
3. 3. 엔티티 선언
엔티티는 매크로와 유사하게, 문서 전체에서 유지되는 값을 할당한다.[5] 낯선 문자에 대한 숫자 문자 참조보다 더 인식 가능한 이름을 지정하거나, XML 텍스트의 가독성을 높이는 데 사용된다. 엔티티는 크게 내부 엔티티와 외부 엔티티 두 가지 유형으로 나뉜다.- '''내부 엔티티'''는 선언에 정의된 임의의 텍스트 내용에 이름을 연결한다. 문서에 선언된 DTD의 ''내부 서브세트'' 또는 ''외부 서브세트''에 있을 수 있다. 명명된 엔티티 참조가 문서에서 발견되면, 참조는 엔티티에 정의된 텍스트 내용으로 즉시 대체되고 파싱은 이 대체 텍스트 내에서 계속된다.
- '''미리 정의된 명명된 문자 엔티티'''는 내부 엔티티와 유사하지만, 5개는 모든 SGML, HTML 및 XML 파서에서 특별하게 처리된다. 명명된 문자 엔티티 참조가 문서에서 발견되면, 참조는 엔티티에 정의된 문자 내용으로 즉시 대체되지만 파싱은 대체 텍스트 '''후'''에 계속된다. 이를 통해 HTML 또는 XML의 핵심 구문에 필요한 일부 문자를 이스케이프할 수 있다. (특히 엔티티 참조 시작에 예약된 "&", 마크업 태그를 구분하는 "<" 또는 ">", 속성 및 엔티티 정의의 값을 구분하는 "큰따옴표" 또는 '작은따옴표').
- '''외부 엔티티'''는 외부 저장 객체를 참조한다. 문서에 고유한 이름으로 선언되고 내용의 소스를 지정하는 공용 식별자 (FPI) 및/또는 시스템 식별자 (URI로 해석됨)로 정의된다.
- '''파싱된 외부 엔티티'''는 해당 내용을 검색하고 내부 엔티티로 선언된 것처럼 파싱한다.
- '''파싱되지 않은 외부 엔티티'''는 불투명한 참조로 처리되고 SGML 또는 XML 파서를 사용하는 응용 프로그램에 신호로 전송된다.
DTD는 '''요소형 선언''', '''속성 목록 선언''', '''엔티티 선언'''(또는, '''실체 참조 선언'''), '''기법 선언'''으로 구성된다. 엔티티 선언은 SGML/XML 문서 내에 기술할 수 있는 엔티티 참조에 대해 정의한다. SGML/XML 문서 내에서 엔티티 참조를 기술하면 DTD의 엔티티 선언에 따라 문자열을 치환하거나, 외부 파일의 내용을 포함시킬 수 있다.
```xml
3. 4. 표기법 선언
표기법은 SGML 또는 XML에서 사용된다. 이는 애플리케이션에 해석을 맡긴 구문 분석되지 않은 외부 엔터티에 대한 완전한 참조를 제공한다(애플리케이션이 직접 해석하거나 외부 엔터티 자체를 검색함). 즉, 문서 본문에서 사용할 수 있는 간단한 이름을 할당한다. 예를 들어, 표기법은 XML 1.1 문서에서 비 XML 데이터를 참조하는 데 사용될 수 있다. 예를 들어, 특정 렌더러와 연결하기 위해 SVG 이미지를 주석 처리하려면 다음과 같이 한다.[6][7]```xml
```
이는 이 유형의 외부 이미지의 TEXT를 선언하고 "type-image-svg"라는 표기 이름과 연결한다. 그러나 표기 이름은 일반적으로 표기법을 생성하거나 사용하는 애플리케이션에 특정한 명명 규칙을 따른다.
기법 선언은 대상 SGML/XML 문서에서 참조하는 외부 파일의 종류 (예: JPEG 등)를 지정한다.
4. DTD 연결
문서 형식 정의(DTD)는 문서 형식 선언(DOCTYPE)을 통해 XML 또는 SGML 문서와 연결된다. DOCTYPE은 XML 문서 시작 부분 근처의 `doctypedecl` 구문에 나타난다.[2] 이 선언은 문서가 참조된 DTD에 의해 정의된 형식의 인스턴스임을 설정한다.
DOCTYPE는 다음 두 종류의 선언을 포함한다.
- 선택적 ''외부 서브셋''
- 선택적 ''내부 서브셋''
내부 서브셋 선언은 문서 자체의 DOCTYPE의 일부를 형성한다. 외부 서브셋 선언은 별도의 텍스트 파일에 위치한다. 외부 서브셋은 ''공개 식별자'' 및/또는 ''시스템 식별자''를 통해 참조될 수 있다. 문서를 읽는 프로그램은 외부 서브셋을 읽을 필요가 없을 수도 있다.
5. DTD의 제한성
6. DTD 예시
DOCTYPE의 다음 예시는 공개 식별자와 시스템 식별자를 모두 포함한다.[2]
```xml
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
```
모든 HTML 4.01 문서는 다음 세 가지 SGML DTD 중 하나를 따른다.[2]
공개 식별자 |
---|
[http://www.w3.org/TR/html4/strict.dtd -//W3C//DTD HTML 4.01//EN] |
[http://www.w3.org/TR/html4/loose.dtd -//W3C//DTD HTML 4.01 Transitional//EN] |
[http://www.w3.org/TR/html4/frameset.dtd -//W3C//DTD HTML 4.01 Frameset//EN] |
7. 마크업 선언
DTD는 요소 및 속성 목록 선언을 통해 문서 클래스의 구조를 설명한다. 요소 선언은 문서 내에서 허용되는 요소 집합의 이름을 지정하고, 각 요소 내에 포함될 수 있는 내용(하위 요소, 문자 데이터 등)을 규정한다.[3] 속성 목록 선언은 각 요소에 대해 허용되는 속성 집합을 지정하고, 각 속성 값의 유형이나 가능한 값의 집합을 포함한다.[3]
DTD 마크업 선언은 XML 문서 클래스의 구조에서 허용되는 요소 유형, 속성 목록, 개체, 표기법을 선언한다.[3]
간단한 DTD 예시는 다음과 같다.
```dtd
```
위 DTD는 다음을 정의한다.
- `firstName` 요소: 문자열 데이터를 내용으로 가진다.
- `secondName` 요소: 문자열 데이터를 내용으로 가진다.
- `info` 요소: DTD에 선언된 임의의 요소나 문자열 데이터를 내용으로 가질 수 있다.
- `data` 요소: `firstName`, `secondName`, `info` 요소를 순서대로 가진다. `info` 요소는 선택적(`?`)이다.
- `myDocument` 요소: 0개 이상의 `data` 요소를 가진다.
- `data` 요소는 `age` 속성을 가질 수 있다. `age` 속성은 문자열 데이터이며, 생략 가능(`#IMPLIED`)하다.
위 DTD에 따른 XML 문서 예시는 다음과 같다.
```xml
7. 1. 요소 형식 선언
요소 유형 선언은 요소와 가능한 내용을 정의한다. 유효한 XML 문서는 DTD에 정의된 요소만 포함한다.다양한 키워드와 문자가 요소의 내용을 지정한다.
- `EMPTY`: 정의된 요소가 내용을 허용하지 않도록 지정한다. 즉, 텍스트 요소조차도 자식 요소를 가질 수 없다 (공백이 있는 경우 무시됨).
- `ANY`: 정의된 요소가 제한 없이 모든 내용을 허용하도록 지정한다. 즉, 자식 요소의 수와 유형(텍스트 요소 포함)을 가질 수 있다.
- 또는 정의된 요소의 내용에서 직접 자식으로 허용되는 요소만 지정하는 표현식이다. 이 내용은 다음과 같다.
- '''혼합 내용''', 즉, 내용에 하나 이상의 텍스트 요소와 0개 이상의 명명된 요소가 포함될 수 있지만 순서와 발생 횟수는 제한될 수 없다. 이는 다음과 같다.
- `( #PCDATA )`: 역사적으로 ''파싱된 문자 데이터''를 의미하며, 이는 내용에 하나의 텍스트 요소만 허용된다는 것을 의미한다 (수량자는 허용되지 않음).
- `( #PCDATA | ''요소 이름'' | ... )*`: 두 개 이상의 자식 요소(텍스트 요소 또는 지정된 명명된 요소만 포함)의 제한된 선택 (괄호 안에 있고 "|" 파이프 문자로 구분되며 필수 "*" 수량자로 종료되는 배타적 목록)은 내용에서 순서와 발생 횟수에 관계없이 사용할 수 있다.
- '''요소 내용''', 즉 내용의 자식 요소에 텍스트 요소가 없어야 함을 의미한다 (자식 요소 사이에 인코딩된 모든 공백은 주석과 마찬가지로 무시됩니다). 이러한 요소 내용은 터미널 기호가 없고 요소 이름이 비터미널 기호인 바커스-나우르 표기법의 변형에서 ''내용 파티클''로 지정된다. 요소 내용은 다음과 같다.
- '''내용 파티클'''은 DTD에 선언된 요소의 이름이거나 ''시퀀스 목록'' 또는 ''선택 목록''일 수 있다. 선택적 ''수량자''가 뒤따를 수 있다.
- '''시퀀스 목록'''은 하나 이상의 ''내용 파티클''의 정렬된 목록을 의미한다 (괄호 안에 있고 "," 쉼표 문자로 구분): 모든 ''내용 파티클''은 정의된 요소의 내용에서 지정된 위치와 상대적 순서로 연속적으로 직접 자식으로 나타나야 한다.
- '''선택 목록'''은 두 개 이상의 ''내용 파티클''의 상호 배타적 목록을 의미한다 (괄호 안에 있고 "|" 파이프 문자로 구분): 이러한 ''내용 파티클'' 중 하나만 정의된 요소의 내용에 같은 위치에 나타날 수 있다.
- '''수량자'''는 요소의 내용에서 지정된 위치에 있는 이러한 항목의 연속적인 발생 횟수를 제한하기 위해 적용되는 지정된 항목 바로 뒤에 오는 단일 문자이다. 이는 다음과 같다.
- `+`: 항목이 하나 이상 나타나야 함을 지정한다. 각 발생의 유효한 내용은 다를 수 있다.
- `*`: 항목의 발생 횟수(0개 이상)를 허용하도록 지정한다. 항목은 선택 사항이며 각 발생의 유효한 내용은 다를 수 있다.
- `?`: 한 번 이상 발생하지 않아야 함을 지정한다. 항목은 선택 사항이다.
- 수량자가 없으면 지정된 항목이 요소의 내용에서 지정된 위치에 정확히 한 번 나타나야 한다.
예를 들어:
```dtd
```
요소 유형 선언은 ''유효성 검사하지 않는'' SGML 및 XML 파서에서 무시되지만(이 경우 구문 분석된 문서에서 모든 요소가 어떤 순서로든, 어떤 수의 발생으로든 허용됨) 이러한 선언은 여전히 형식과 유효성을 검사한다.
대상 SGML/XML 문서에서 사용할 요소를 선언하고, 해당 요소의 이름, 관련 요소와의 부모-자식 관계 및 출현 순서를 정의한다.
```dtd
```
이때, 요소명은 대상 요소의 이름이며, 구성 요소는 다음과 같은 종류로 나뉜다.
간단한 DTD 예시:
```dtd
```
DTD 설명:
- 제1행: `firstName` 요소를 선언하고 있다. 이 요소는 내용으로 문자열 데이터를 가진다.
- 제2행: `secondName` 요소를 선언하고 있다. 내용으로 문자열 데이터를 가진다.
- 제3행: `info` 요소를 선언하고 있다. 내용으로, 이 DTD에서 선언된 임의의 요소나 문자열 데이터를 가질 수 있다.
- 제4행: `data` 요소를 선언하고 있다. 내용으로 `firstName`, `secondName`, `info`의 각 요소를 가진다. 요소의 출현 순서는 이 순서여야 한다 (예를 들어 `firstName` 앞에 `secondName`이 나타나서는 안 된다). `?`는 옵셔널임을 나타낸다. `info` 요소는 `secondName` 요소 뒤에 나타나도 좋고, 나타나지 않아도 좋다.
- 제5행: `myDocument` 요소를 선언하고 있다. 내용으로 0개에서 n개의 `data` 요소를 가진다.
- 제6행: `data` 요소의 속성 리스트 선언을 하고 있다. `data` 요소는 `age` 속성을 가진다. `age` 속성은 문자열 데이터이며, 생략할 수 있다.
7. 2. 속성 목록 선언
속성 목록은 주어진 요소 유형에 대해 해당 유형과 관련된 모든 가능한 속성의 목록을 지정한다. 각 가능한 속성에 대해 다음을 포함한다.[4]- 속성의 선언된 이름
- 데이터 유형 (또는 가능한 값의 열거)
- 기본값
예를 들어:
```xml
src CDATA #REQUIRED
id ID #IMPLIED
sort CDATA #FIXED "true"
print (yes | no) "yes"
>
```
다음은 SGML과 XML에서 모두 지원하는 몇 가지 속성 유형이다.
- `CDATA`: ''문자 데이터''를 의미하며 속성의 유효한 값이 고정으로 지정되지 않는 한 모든 텍스트 값이 될 수 있음을 나타낸다. (DTD의 주석은 실제로 허용되는 값을 더 자세히 문서화할 수 있지만 DTD 구문은 그러한 정확한 사양을 허용하지 않음).
- `ID`: 속성의 유효한 값은 유효한 식별자여야 하며, 이 정의된 식별자를 사용하여 참조 대상을 정의하고 현재 요소에 고정한다. (문서 단편 식별자를 포함하여 "#" 기호 뒤의 URI 끝에 지정될 수 있음). 동일한 문서의 다른 요소가 동일한 식별자를 정의하는 경우 오류가 발생한다. 고유성 제약 조건은 또한 식별자 자체가 다른 의미를 가지지 않으며 애플리케이션에서 식별자를 불투명하게 처리해야 함을 의미한다. XML은 DTD에서 선언할 필요 없이 이 유형의 표준 의사 속성 " `xml:id` "를 미리 정의하므로 고유성 제약 조건은 XML 문서의 어디에서든 지정될 때 이러한 정의된 식별자에도 적용된다.
- `IDREF` 또는 `IDREFS`: 속성의 유효한 값은 유효한 식별자(또는 이러한 식별자의 공백으로 구분된 목록)일 수 있으며, DTD에서 `ID` 유형으로 선언된 속성을 사용하여 문서에 정의된 고유한 요소(또는 의사 속성 " `xml:id` "를 사용하여 XML 문서에 정의된 고유한 요소)를 참조해야 하며, 유효한 값은 동일한 식별자이다.
- `NMTOKEN` 또는 `NMTOKENS`: 속성의 유효한 값은 유효한 이름 토큰(또는 이러한 이름 토큰의 공백으로 구분된 목록)일 수 있지만 문서 내의 고유한 식별자로 제한되지 않는다. 이 이름은 보조적이고 응용 프로그램 종속적인 의미를 가질 수 있으며 추가적인 명명 제약 조건이 필요할 수 있지만 이는 DTD의 범위를 벗어납니다.
- `ENTITY` 또는 `ENTITIES`: 속성의 유효한 값은 구문 분석되지 않은 외부 엔티티의 이름(또는 이러한 이름의 공백으로 구분된 목록)일 수 있으며, 문서 유형 선언에서도 선언되어야 한다. 이 유형은 HTML 파서에서 지원되지 않지만 SGML 및 XML 1.0 또는 1.1(XHTML 및 SVG 포함)에서 유효하다.
- `(''value1''|...)`: 속성의 유효한 값은 열거된 목록 중 하나일 수 있다 (괄호 안에 지정되고 "`|`" 파이프 문자로 구분). 여기서 열거의 각 값은 간단한 이름 토큰이 아닌 경우 `'`작은따옴표`'` 또는 `"`큰따옴표`"`로 묶어 지정할 수 있다.
- `NOTATION (''notation1''|...)`: 속성의 유효한 값은 표기법 이름의 열거된 목록 중 하나일 수 있다 (괄호 안에 지정되고 "`|`" 파이프 문자로 구분). 여기서 열거된 각 표기법 이름은 문서 유형 선언에서도 선언되어야 한다. 이 유형은 HTML 파서에서 지원되지 않지만 SGML 및 XML 1.0 또는 1.1(XHTML 및 SVG 포함)에서 유효하다.
기본값은 속성이 발생해야 하는지( `#REQUIRED` ) 또는 발생하지 않아야 하는지( `#IMPLIED` ), 고정된 값을 갖는지( `#FIXED` ), 또는 XML 태그에서 주어진 속성이 생략된 경우 어떤 값을 기본값으로 사용해야 하는지("…")를 정의할 수 있다.
속성 목록 선언은 ''비 유효성 검사'' SGML 및 XML 파서에서 무시되지만 (이 경우 구문 분석된 문서의 모든 요소 내에서 모든 속성이 허용됨) 이러한 선언은 여전히 정형성 및 유효성에 대해 확인된다.
대상 SGML/XML 문서의 요소가 갖는 속성의 유형과 기본값을 정의한다.
``
예를 들어, 배우의 출신 지역을 속성으로 정의하는 경우, 다음과 같은 속성 목록을 생각할 수 있다.
``
...
`<배우 출신 지역="토카이">배우A배우>`
7. 3. 엔티티 선언
엔티티는 매크로와 유사하며, 문서 전체에서 유지되는 값을 할당한다. 일반적인 용도는 낯선 문자에 대한 숫자 문자 참조보다 더 인식 가능한 이름을 갖는 것이다.[5] 엔티티는 XML 텍스트의 가독성을 향상시키는 데 도움이 된다. 일반적으로 내부와 외부의 두 가지 유형이 있다.- '''내부 (파싱된) 엔티티'''는 선언에 정의된 임의의 텍스트 내용에 이름을 연결한다 (문서에 선언된 DTD의 ''내부 서브세트'' 또는 ''외부 서브세트''에 있을 수 있음). 명명된 엔티티 참조가 문서의 나머지 부분 (DTD의 나머지 부분 포함)에서 발견되고 이 엔티티 이름이 파싱된 엔티티로 효과적으로 정의된 경우, 참조 자체가 파싱된 엔티티에 정의된 텍스트 내용으로 즉시 대체되고 파싱은 이 대체 텍스트 내에서 계속된다.
- '''미리 정의된 명명된 문자 엔티티'''는 내부 엔티티와 유사하다. 그러나 5개는 모든 SGML, HTML 및 XML 파서에서 특별하게 처리된다. 이러한 엔티티는 일반 파싱된 엔티티와 약간 다릅니다. 명명된 문자 엔티티 참조가 문서에서 발견되면, 참조는 엔티티에 정의된 문자 내용으로 즉시 대체되지만 파싱은 대체 텍스트 '''후'''에 계속된다. 대체 텍스트는 현재 파싱된 토큰에 문자 그대로 즉시 삽입된다 (해당 문자가 해당 토큰의 텍스트 값에 허용되는 경우). 이를 통해 HTML 또는 XML의 핵심 구문에 필요한 일부 문자를 특별한 구문 역할에서 이스케이프할 수 있다 (특히 엔티티 참조 시작에 예약된 "&", 마크업 태그를 구분하는 "<" 또는 ">", 속성 및 엔티티 정의의 값을 구분하는 "큰따옴표" 또는 '작은따옴표'). 미리 정의된 문자 엔티티에는 동일한 방식으로 처리되고 나타내는 문자를 이스케이프하거나 문서 인코딩에서 지원하는 문자 레퍼토리의 제한을 우회하는 데 사용할 수 있는 숫자 문자 참조도 포함된다.
- SGML의 기본 프로필 또는 HTML 문서에서는 내부 엔티티 선언이 불가능하다 (외부 DTD 서브세트가 검색되지 않고, 내부 DTD 서브세트가 이러한 기본 프로필에서 지원되지 않기 때문).
- 대신 HTML 표준은 수백 개의 명명된 문자 엔티티의 큰 세트를 미리 정의하며, 이는 파서에서 사용하는 DTD에 정의된 표준 파싱된 엔티티로 처리될 수 있다.
- '''외부 엔티티'''는 외부 저장 객체를 참조한다. 문서에 고유한 이름으로 선언되고 내용의 소스를 지정하는 공용 식별자 (FPI) 및/또는 시스템 식별자 (URI로 해석됨)로 정의된다. 실제로 두 가지 변형으로 존재한다.
- '''파싱된 외부 엔티티''' (내용의 URI를 나타내는 SYSTEM 식별자로 가장 자주 정의됨)는 정의에서 명명된 주석과 연결되지 '''않는다'''. 이 경우 XML 또는 SGML 파서를 검증하면 해당 내용을 검색하고 내부 엔티티로 선언된 것처럼 파싱한다 (유효 대체 텍스트를 포함하는 외부 엔티티).
- '''파싱되지 않은 외부 엔티티'''는 주석 이름으로 정의되고 연결되며, 이 경우 불투명한 참조로 처리되고 SGML 또는 XML 파서를 사용하는 응용 프로그램에 신호로 전송된다. 해당 해석, 검색 및 파싱은 응용 프로그램에 맡겨지며, 응용 프로그램이 지원하는 주석 유형에 따라 결정된다.
- 외부 엔티티는 SGML의 기본 프로필 또는 HTML 문서에서는 지원되지 않지만 SGML의 전체 구현 및 XML 1.0 또는 1.1 (XHTML 및 SVG 포함, 해당 문서 유형에 엄격하게 필요하지 않은 경우에도)에서는 유효하다.
내부 엔티티 선언의 예 (SGML 문서의 내부 DTD 서브세트)는 다음과 같다.
```xml
]>
```
```xml
```
내부 엔티티는 파싱 순서대로 DTD 또는 문서 본문에서 참조되지 않고 파싱되지 않는 한 어떤 순서로든 정의할 수 있다. 아직 정의되지 않은 엔티티에 대한 참조를 파싱된 엔티티의 내용에 포함하는 것은 유효하지만, 이 엔티티가 완전히 정의되기 전에 다른 곳에서 명명된 엔티티 참조를 포함하는 것은 유효하지 않다. 여기에는 정의된 내용에서 참조된 모든 다른 내부 엔티티를 포함한다 (이는 내부 엔티티의 순환적 또는 재귀적 정의도 방지한다). 이 문서는 다음과 같이 파싱된다.
```xml
]>
```
```xml
```
"author" 내부 엔티티에 대한 참조는 "signature" 내부 엔티티의 대체 텍스트로 대체되지 않는다. 대신, "signature" 엔티티 참조가 "sgml" 요소의 내용 내에서 파싱될 때만, 그리고 검증 파서에 의해서만 대체된다 (비검증 파서는 요소의 내용 또는 문서 본문의 속성 값 내에서 발생하는 엔티티 참조를 대체하지 않는다).
이는 내부 엔티티 정의에 지정된 대체 텍스트가 '''매개변수''' 엔티티 참조 (문자 "%"로 시작하며, 대체는 파싱된 DTD 내용에 적용됨)와 '''일반''' 엔티티 참조 (문자 "&"로 시작하며, 대체는 실제로 파싱되고 검증될 때까지 지연됨)를 구별할 수 있기 때문이다. DTD에서 매개변수 엔티티 참조를 소개하는 "%" 문자는 DTD 외부에서 특별한 역할을 잃고 리터럴 문자가 된다.
그러나 미리 정의된 문자 엔티티에 대한 참조는 검증 파서가 필요 없이 발생하는 모든 곳에서 대체된다 (문자 "&"로만 시작됨).
엔티티 선언은 대상 SGML/XML 문서 내에 기술할 수 있는 엔티티 참조에 대해 정의한다. SGML/XML 문서 내에서 엔티티 참조를 기술하면 DTD의 엔티티 선언에 따라 문자열을 치환하거나, 외부 파일의 내용을 포함시킬 수 있다.
```xml
7. 4. 표기법 선언
표기법은 SGML 또는 XML에서 사용되며, 구문 분석되지 않은 외부 엔터티에 대한 완전한 참조를 제공하며, 해석은 애플리케이션에 맡긴다.[6][7]8. XML DTD와 스키마 유효성 검사
XML DTD 구문은 여러 XML 스키마 언어 중 하나이다. XML DTD는 엔티티와 노테이션을 정의할 수 있다. 독립 실행형 모드에서 XML 문서의 스키마 유효성 검사는 DTD로 가능하다.[1]
9. XML DTD 스키마 예시
다음은 사람 목록의 스키마를 설명하는 매우 간단한 외부 XML DTD의 예시이다.
```xml
```
각 줄에 대한 설명은 다음과 같다.
- `people_list`는 유효한 요소 이름이며, 이 요소의 인스턴스에는 여러 개의 `person` 요소가 포함될 수 있다. `*`는 `people_list` 요소 내에 0개 이상의 `person` 요소가 있을 수 있음을 나타낸다.
- `person`은 유효한 요소 이름이며, 이 요소의 인스턴스에는 `name` 요소 하나, `birthdate`(선택 사항) 하나, `gender`(역시 선택 사항), `socialsecuritynumber`(역시 선택 사항)가 차례로 포함된다. `?`는 요소가 선택 사항임을 나타낸다. `name` 요소에는 `?`가 없으므로 `person` 요소는 ''반드시'' `name` 요소를 포함해야 한다.
- `name`, `birthdate`, `gender`, `socialsecuritynumber`는 모두 유효한 요소 이름이며, 이 요소들의 인스턴스에는 "파싱된 문자 데이터"(#PCDATA)가 포함된다.
이 DTD를 사용하고 준수하는 XML 파일의 예시는 다음과 같다. DTD는 여기서 SYSTEM 지정자와 URI를 통해 외부 하위 집합으로 참조된다. 상대 URI 참조 "example.dtd"로 DTD를 식별할 수 있다고 가정한다. "!DOCTYPE" 뒤의 "people_list"는 DTD에 정의된 첫 번째 요소인 루트 태그의 이름이 "people_list"임을 알려준다.
```xml
```
이것은 DTD 구성 요소를 위에서 붙여넣고 ''example.dtd''라는 텍스트 파일로 저장하고 XML 파일을 다른 이름의 텍스트 파일로 저장한 다음, XML 지원 브라우저(인터넷 익스플로러 또는 모질라 파이어폭스 등)에서 XML 파일을 열어 렌더링할 수 있다. 두 파일 모두 동일한 디렉터리에 저장해야 한다. 그러나 많은 브라우저는 XML 문서가 DTD의 규칙을 준수하는지 확인하지 않는다. DTD가 구문적으로 올바른지 확인하기만 하면 된다. 보안상의 이유로 외부 DTD를 읽지 않도록 선택할 수도 있다.
동일한 DTD는 문서 형식 선언의 대괄호 안에 묶어 XML 문서 자체에 내부 하위 집합으로 직접 포함할 수도 있다. 이 경우 문서는 더 이상 외부 엔티티에 의존하지 않으며 독립 실행형 모드로 처리할 수 있다.
```xml
]>
10. DTD의 대안
- XML 스키마 정의(XSD)는 W3C 내에서 권고안 지위를 획득했으며[8], 더 강력한 타이핑과 자바 선언과의 더 쉬운 왕복(round-tripping) 기능으로 인해 "데이터 중심적"(즉, 트랜잭션 비 게시) XML 사용에 널리 사용된다. 대부분의 출판 업계는 XSD의 복잡성이 추가되어도 특별한 이점을 얻지 못한다고 생각하여, DTD가 여전히 훨씬 더 인기가 있다. XML 스키마 정의는 그 자체가 XML 문서인 반면, DTD는 그렇지 않다.
- RELAX NG는 DSDL의 일부이기도 하며, ISO 국제 표준이다.[9] XSD보다 더 표현력이 풍부하며, 더 간단한 구문을 제공하지만, 상용 소프트웨어 지원은 더디게 이루어지고 있다.
참조
[1]
웹사이트
Introduction to DTD
https://www.w3school[...]
[2]
웹사이트
doctypedecl
http://www.w3.org/TR[...]
W3C
[3]
서적
Sams teach yourself XML in 10 minutes
https://books.google[...]
Sams Publishing
[4]
문서
Attribute-list Declaration
http://www.w3.org/TR[...]
[5]
웹사이트
DTD Entities
https://www.w3school[...]
W3Schools
[6]
문서
Notation Declarations
http://www.w3.org/TR[...]
[7]
문서
Notation Declarations
http://www.w3.org/TR[...]
[8]
웹사이트
XML Schema Part 1: Structures (Second Edition)
https://www.w3.org/T[...]
W3C
2022-01-02
[9]
웹사이트
ISO/IEC 19757-2:2008 - Information technology -- Document Schema Definition Language (DSDL) -- Part 2: Regular-grammar-based validation -- RELAX NG
http://www.iso.org/i[...]
ISO
2011-05-17
[10]
웹사이트
XML Denial of Service Attacks and Defenses
http://msdn.microsof[...]
MSDN Magazine
2009-11
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com